博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
fileupload的乱码解决
阅读量:7099 次
发布时间:2019-06-28

本文共 6523 字,大约阅读时间需要 21 分钟。

解决方法就是这段代码,其中item是fileupload中的FileItem

String value = new String(item.getString().getBytes("ISO-8859-1"), "UTF-8") ;

但是说老实话,这个解决方法不具有通用性,换个环境很可能就不能用了,比如刚才,我用到smartupload上,就给我来了个exception

1、获取form中字段(即除了上传的文件以外的那些元素)是中文,如果出现了乱码,使用了如下代码,解决了乱码的问题

String value = item.getString("UTF-8");

2、如果上传的文件名是中文,如果出现了乱码,只要设置了request.setCharacterEncoding("UTF-8")就可以解决

完整代码如下:

submit.html

Insert title here
姓名:
照片:

display.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ page import="org.apache.commons.fileupload.*" %><%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %><%@ page import="org.apache.commons.fileupload.servlet.*" %><%@ page import="java.util.List" %><%@ page import="java.util.Iterator;" %>
Insert title here<% request.setCharacterEncoding("UTF-8") ;%><% DiskFileItemFactory factory = new DiskFileItemFactory() ; ServletFileUpload upload = new ServletFileUpload(factory) ; upload.setFileSizeMax(3 * 1024 * 1024) ; // 单个文件大小3M封顶 List
items = upload.parseRequest(request) ; // 接收全部内容 Iterator
iter = items.iterator() ; while(iter.hasNext()){ FileItem item = iter.next() ; String fieldName = item.getFieldName() ; // 取得表单控件的名称%>

    <%=fieldName%> --> <%=item.isFormField()%>

    <% if(!item.isFormField()){ // 不是普通文本 String fileName = item.getName() ; // 取得文件的名称 String contentType = item.getContentType() ; // 文件类型 long sizeInBytes = item.getSize() ;%>
  • 上传文件名称:<%=fileName%>
  • 上传文件类型:<%=contentType%>
  • 上传文件大小:<%=sizeInBytes%> bytes<% } else { String value = item.getString("UTF-8");%>
  • 普通参数:<%=value%><% }%>
<% }%>

上传成功,返回

下面是在网上找到的资料:

-------------------------------------

最近一直在整上传图片的东西,改了很长时间,实验了3,4种方法,最终还是选择了commons fileupload这个上传组件~~

最后阶段出现的乱码很严重,不仅有文件名称的中文乱码,还有非文件的表单字段的乱码,也查了好多前辈的资料,最后的已解决。改动如下,和大家共享:

首先说明下我用的组建方法

DiskFileItemFactory dfif = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(dfif);
再者我没有忽略简单form字段,项目中用到了~~
1:写一个过滤器吧,对所有的request请求都使用utf-8编码,有了它,所有乱码都不怕不怕啦

                     // 这个方法我试了一下,在%WEB-ROOT%/WEB-INF/web.xml中添加了,但是没有什么明显效果,可能是我哪里没用对,我配置的具体情况见listting 1

package up;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class CharacterEncodingFilter implements Filter {  private String config;  public void destroy() {    this.config = null;  }  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {    HttpServletRequest req;    req = (HttpServletRequest) request;    HttpServletResponse res;    res = (HttpServletResponse) response;    req.setCharacterEncoding(config);    res.setCharacterEncoding(config);    chain.doFilter(req, res);  }   public void init(FilterConfig config) throws ServletException {    this.config = config.getInitParameter("chars");  }}

下面的配置也非常的重要,不可忽略!!在web.xml里面加上下面的一段话:

CharacterEncodingFilter
up.CharacterEncodingFilter
chars
utf-8
CharacterEncodingFilter
/*

2.在上传的servlet中取得request的编码格式:

                                       // 我不太明白这个所谓的“上传的servlet”指的是谁?反正我在接收form的页面使用request.getCharacterEncoding()得到的是null

  String encoding=request.getCharacterEncoding();

3.解决上传文件的路径乱码问题:
  ServletFileUpload sfu = new ServletFileUpload(dfif);之后加上:
  sfu.setHeaderEncoding(encoding);
4:解决表单字段的乱码:
  String(fileItem.getString(encoding));
比如其中一项表单:
  String id1=new String(fileItem.getString(encoding));
以此类推。
5:这时候,如果还有问题,就可能是tomcat的配置问题了,找到server.xml,寻找到如下字段模仿修改即可
  <Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
      redirectPort="8443" URIEncoding="UTF-8"/>
这几步完成后,乱码问题就彻底摆脱掉了~~~

 

listing 1.

下面是这个filter,我编译好之后放到了%WEB-ROOT%/WEB-INF/classes中

package cn.mldn.lxh.encoding.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class CharacterEncodingFilter implements Filter {  private String config;  public void destroy() {    this.config = null;  }  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {    HttpServletRequest req;    req = (HttpServletRequest) request;    HttpServletResponse res;    res = (HttpServletResponse) response;    req.setCharacterEncoding(config);    res.setCharacterEncoding(config);    chain.doFilter(req, res);  }   public void init(FilterConfig config) throws ServletException {    this.config = config.getInitParameter("chars");  }}

这个是%WEB-ROOT%/WEB-INF/web.xml

Welcome to Tomcat
Welcome to Tomcat
he
/WEB-INF/hello.jsp
he
/hello.mldn
dbinit
/WEB-INF/init.jsp
driver
org.gjt.mm.mysql.Driver
url
jdbc:mysql://localhost:3306/mldn
dbinit
/config.mldn
CharacterEncodingFilter
cn.mldn.lxh.encoding.filter.CharacterEncodingFilter
chars
utf-8
CharacterEncodingFilter
/*

 

转载地址:http://lkhql.baihongyu.com/

你可能感兴趣的文章
React Native系列——Navigator组件的使用介绍
查看>>
bootstrap 代码
查看>>
jsp自定义标签
查看>>
我的技术博客-公告板!
查看>>
c++大文件读写操作(文件内存映射)
查看>>
nginx 主动防御DDOS***
查看>>
JS学习笔记
查看>>
linux sed seq awk 部分
查看>>
oracle删除168万数据;varchar表示时间;java传参date;传参后的时间保存到秒
查看>>
冰箱保鲜标准出炉,行业或迎新纪元
查看>>
十三、添加RD 会话主机角色
查看>>
Android笔记--一个图片+文字的自定义按钮
查看>>
Android/Java 读、写MP3文件ID3V1信息
查看>>
企业开展智能制造,将会存在和带来哪些风险?
查看>>
从Kubernetes 1.14 发布,看技术社区演进方向
查看>>
PHP源码:方维o2o本地生活服务系统v2.2多城市商业版
查看>>
Websense:Android的安全性令人担忧
查看>>
Office 365 系列之四:添加自定义域
查看>>
Android应用程序启动过程——Launcher源码分析
查看>>
(实战)从关联表中取得JSON数据
查看>>